from enum import Enum
from django.http import JsonResponse, HttpResponse, StreamingHttpResponse


class ResponseCode(Enum):
    SUCCESS = 200  # 操作成功
    CREATED = 201  # 资源创建成功
    ACCEPTED = 202  # 请求已被接受，但尚未处理
    NO_CONTENT = 204  # 请求成功，但没有响应体内容
    BAD_REQUEST = 400  # 请求错误，可能由于缺少必需的参数或参数格式不正确
    UNAUTHORIZED = 401  # 未授权，需要提供有效的身份验证凭证
    FORBIDDEN = 403  # 禁止访问，权限不足
    NOT_FOUND = 404  # 请求的资源不存在
    METHOD_NOT_ALLOWED = 405  # 不允许使用该HTTP方法
    CONFLICT = 409  # 资源冲突，通常发生在创建资源时
    UNPROCESSABLE_ENTITY = 422  # 请求格式正确，但由于语义错误，无法处理请求
    TOO_MANY_REQUESTS = 429  # 请求过多，客户端应稍后再试
    INTERNAL_SERVER_ERROR = 500  # 服务器内部错误
    # ··· 状态码可以自定义


def api_response(code, msg, data=None, status=None):
    http_status = status if status is not None else code.value
    # 如果 data 是文件流（HttpResponse 对象），直接返回文件流响应
    if isinstance(data, HttpResponse):
        return data  # 返回文件流响应

    # # 优先判断流式数据（生成器或迭代器）
    # if hasattr(data, '__iter__') and not isinstance(data, (str, bytes)) and not isinstance(data, dict):
    #     # 返回流式响应
    #     def generate():
    #         for part in data:
    #             yield part
    #
    #     return StreamingHttpResponse(generate(), content_type='text/event-stream')

    # 如果 data 是会话列表类型，构建对应的 JSON 响应
    if isinstance(data, dict) and "data" in data and isinstance(data["data"], list):
        return JsonResponse(
            {"code": code.value, "msg": msg, "data": data},
            json_dumps_params={"ensure_ascii": False},
        )

    # 默认处理其他 JSON 数据
    if data is None:
        return JsonResponse(
            {"code": code.value, "msg": msg},
            status=http_status,
            json_dumps_params={"ensure_ascii": False},
        )
    else:
        return JsonResponse(
            {"code": code.value, "msg": msg, "data": data},
            status=http_status,
            json_dumps_params={"ensure_ascii": False},
        )


if __name__ == "__main__":
    pass
